iT邦幫忙

DAY 23
0

Java 學習筆記系列 第 23

Java 學習筆記 [23] 執行緒的同步

  • 分享至 

  • xImage
  •  

開始三天假期了~~~~大雨嘩啦嘩啦,不知道還有沒有煙火看呢!?

好啦,回歸正題。

上一篇稍微介紹一下了執行緒,

這次小菜鳥想跟大家分享執行緒的同事,啊不,是同步。

理論上來說,Therad物件可以存取在Java程式中的任何一個物件,

執行緒同步的主要原因是為了避免在同一個時間,

有多個執行緒同時存取同一個物件而造成資料錯誤的混亂場面,

JVM提供了一種機制,再發生多個執行緒同時存取且修改同一個物件時,

利用關鍵字synchronized來解決混亂的情形。

當Therad物件離開synchronized程式區塊時,

代表著程式區塊已經被釋放,

JVM會處於中斷狀態下的眾多Therad物件中,

挑選一個Therad物件繼續執行。

假設我們有兩萬個,沒有看錯是兩萬個金塊!大富豪了...

有三個小偷要來偷金塊,讓他們肆無忌憚的來偷看看,

就是沒有同步時的狀況。

class GoldClass implements Runnable { 
	int grabed; 
	static int totalGold = 20000000; 
	Thread t;

	GoldClass(String name) {
		grabed = 0;
		t = new Thread(this, name);
		t.start();  
	}

	public void run() { 
		while (grabGold() == true) { 
			grabed++; 
		}
		System.out.println(t.getName() + " 總共偷得 " + grabed + " 個金塊.");
	}

	private static boolean grabGold() {
		if (totalGold > 0) { 
			totalGold--; 
			return true;
		} else {
			return false;
		}
	}
}

class NonSynchronizedDemo {
	public static void main(String[] args) {
		System.out.println("共有 " + GoldClass.totalGold + " 個金塊!");
		GoldClass tA = new GoldClass("威士忌");
		GoldClass tB = new GoldClass("伏特加");
		GoldClass tC = new GoldClass("龍舌蘭");
	}
}

祝大家假期愉快~~~~晚安。


上一篇
Java 學習筆記 [22] 生命週期
下一篇
Java 學習筆記 [24] 等待與喚醒
系列文
Java 學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言